﻿ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Btssio.Musique;
namespace RDC.DATA.Class
{
    public static class LastFMAPI
    {
        #region Méthodes
        private static string urlRechercheConcertArtiste = "http://ws.audioscrobbler.com/2.0/?method=artist.getevents&artist=#artistName#&api_key=24a03f3944e49e33b73e71f73cc5352d";
        private static string urlRechercheConcertSalle = "http://ws.audioscrobbler.com/2.0/?method=geo.getevents&location=#locationName#&api_key=24a03f3944e49e33b73e71f73cc5352d";

        /// <summary>
        /// Retourne toutes les informations connues de l'artiste dont l'identifiant est reçu en paramètre.
        /// (ces informations ainsi que sa dicographie complète : tous les morceaux de tous ses albums...)
        /// </summary>
        /// <param name="idArtist">Identifiant de l'artiste.</param>
        /// <returns>Artiste demandé.</returns>
        public static List<Event> getEventByArtist(string artistName)
        {   
            List<Event> listEvents = new List<Event>();
            List<Artist> listArtists = new List<Artist>();

            string urlConcertArtiste = urlRechercheConcertArtiste.Replace("#artistName#", artistName);

            XElement xEvent = XDocument.Load(urlConcertArtiste).Root;

            IEnumerable<XElement> xLesEvents = XDocument.Load(urlConcertArtiste).Root.Element("events").Elements("event");
            IEnumerable<XElement> xLesArtists = XDocument.Load(urlConcertArtiste).Root.Element("events").Elements("event").Elements("artists");

            
            foreach (XElement xUnArtiste in xLesArtists)
            {

               IEnumerable<XNode> lesArtistes = xUnArtiste.Nodes();
               foreach (XNode lesNoeuds in lesArtistes)
               {

                 string nomArtiste = lesNoeuds.ToString();
                 nomArtiste = modifVariableXML(nomArtiste);
                 Artist unArtist = new Artist(null,nomArtiste);
                 listArtists.Add(unArtist);
               }

            }
            foreach (XElement xUnEvent in xLesEvents)
            {
                
               XElement xVenue = xUnEvent.Element("venue");
               XElement xLocalisation = xVenue.Element("location");
               XElement xGeo = xLocalisation.Elements().ElementAt(4);
               IEnumerable<XElement> xLesGeo = xGeo.Elements();
               string latitude = xLesGeo.ElementAt(0).Value;
               string longitude = xLesGeo.ElementAt(1).Value;

                Location uneLocation = new Location(xUnEvent.Element("venue").Element("location").Element("city").Value,
                                                    xUnEvent.Element("venue").Element("location").Element("country").Value,
                                                    xUnEvent.Element("venue").Element("location").Element("street").Value,
                                                    xUnEvent.Element("venue").Element("location").Element("postalcode").Value,
                                                    longitude,
                                                    latitude);

                Venue uneVenue = new Venue(xUnEvent.Element("venue").Element("id").Value,
                                            xUnEvent.Element("venue").Element("name").Value, 
                                            xUnEvent.Element("venue").Element("url").Value,
                                            xUnEvent.Element("venue").Element("website").Value,
                                            xUnEvent.Element("venue").Element("phonenumber").Value,
                                            uneLocation
                                            );

                Event unEvent = new Event(xUnEvent.Element("id").Value,
                                          xUnEvent.Element("title").Value,
                                          listArtists,
                                          uneVenue,
                                          DateTime.Parse(xUnEvent.Element("startDate").Value),
                                          xUnEvent.Elements("image").ElementAt(2).Value,
                                          xUnEvent.Element("website").Value
                                          );

                listEvents.Add(unEvent);
            }

            return listEvents;
        }
        public static List<Event> getGeoEvent(string locationName)
        {
            List<Event> listEvents = new List<Event>();
            List<Artist> listArtists = new List<Artist>();

            string urlConcertArtiste = urlRechercheConcertSalle.Replace("#locationName#", locationName);

            XElement xEvent = XDocument.Load(urlConcertArtiste).Root;

            IEnumerable<XElement> xLesEvents = XDocument.Load(urlConcertArtiste).Root.Element("events").Elements("event");
            IEnumerable<XElement> xLesArtists = XDocument.Load(urlConcertArtiste).Root.Element("events").Elements("event").Elements("artists");


            foreach (XElement xUnArtiste in xLesArtists)
            {

                IEnumerable<XNode> lesA = xUnArtiste.Nodes();
                foreach (XNode lesNoeuds in lesA)
                {
                    Artist unArtist = new Artist(null,lesNoeuds.ToString());
                    listArtists.Add(unArtist);
                }

            }
            foreach (XElement xUnEvent in xLesEvents)
            {
                XElement xVenue = xUnEvent.Element("venue");
                XElement xLocalisation = xVenue.Element("location");
                XElement xGeo = xLocalisation.Elements().ElementAt(4);
                IEnumerable<XElement> xLesGeo = xGeo.Elements();
                string latitude = xLesGeo.ElementAt(0).Value;
                string longitude = xLesGeo.ElementAt(1).Value;
                Location uneLocation = new Location(xUnEvent.Element("venue").Element("location").Element("city").Value,
                                                    xUnEvent.Element("venue").Element("location").Element("country").Value,
                                                    xUnEvent.Element("venue").Element("location").Element("street").Value,
                                                    xUnEvent.Element("venue").Element("location").Element("postalcode").Value,
                                                    longitude,
                                                    latitude);

                Venue uneVenue = new Venue(xUnEvent.Element("venue").Element("id").Value,
                                            xUnEvent.Element("venue").Element("name").Value,
                                            xUnEvent.Element("venue").Element("url").Value,
                                            xUnEvent.Element("venue").Element("website").Value,
                                            xUnEvent.Element("venue").Element("phonenumber").Value,
                                            uneLocation
                                            );

                Event unEvent = new Event(xUnEvent.Element("id").Value,
                                          xUnEvent.Element("title").Value,
                                          listArtists,
                                          uneVenue,
                                          DateTime.Parse(xUnEvent.Element("startDate").Value),
                                          xUnEvent.Element("url").Value,
                                          xUnEvent.Element("website").Value
                                          );

                listEvents.Add(unEvent);
            }

            return listEvents;

        }

        public static string modifVariableXML(string stringAModifier)
        {
            string stringModifier="";

            if (stringAModifier.Contains("<artist>") || stringAModifier.Contains("</artist>"))
            {
                stringModifier = stringAModifier.Replace("<artist>", "");
                stringModifier = stringModifier.Replace("</artist>", "");

            }
            else
            {
                stringModifier = stringAModifier.Replace("<headliner>", "HeadLiner : ");
                stringModifier = stringModifier.Replace("</headliner>", "");
            }
            return stringModifier;


        }
      
        #endregion 
    }
}
